package cn.sc.hunter.framework.helper;

import cn.sc.hunter.framework.annotation.RequestMapping;
import cn.sc.hunter.framework.bean.Handler;
import cn.sc.hunter.framework.bean.Request;
import cn.sc.hunter.framework.util.ArrayUtil;
import cn.sc.hunter.framework.util.CollectionUtil;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 控制器助手类
 */
public final class ControllerHelper {

    /**
     * 存放 请求 与 请求映射关系的 Map
     */
    private final static Map<Request, Handler> REQUEST_MAP = new HashMap<>();

    static {
        // 获取所有的 Controller 类
        Set<Class<?>> controllers = ClassHelper.getControllerClassSet();
        if (CollectionUtil.isNotEmpty(controllers)) {
            // 循环遍历 Controller 类
            controllers.forEach(clazz -> {
                // 获取 Controller 类中定义的方法
                Method[] methods = clazz.getDeclaredMethods();
                if (ArrayUtil.isNotEmpty(methods)) {
                    // 循环遍历当前 Controller 类中的所有声明的方法
                    Arrays.asList(methods).stream().forEach(method -> {
                        // 判断当前方法是否有 ReqeustMapping 注解
                        if (method.isAnnotationPresent(RequestMapping.class)) {
                            // 从 RequestMapping 注解中获取请求规则
                            RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
                            // 初始化 REQUEST_MAP
                            REQUEST_MAP.put(new Request(requestMapping), new Handler(clazz, method));
                        }
                    });
                }
            });
        }
    }

    /**
     * 获取 请求Handler
     */
    public static Handler getHandler(String method, String path){
        Request request = new Request(method, path);
        return REQUEST_MAP.get(request);
    }
}

